#ifndef __KEY_EVENT_H
#define __KEY_EVENT_H
#include "sys.h"



//#0 ****************************   根据实际情况修改   ******************************************************
/* TODO 根据实际情况修改  */
#define KEY_TICK_TIME       50  /* 一个TICK时间(单位:ms)("KeyEvent_Tick" 函数周期调用时间 */
#define KEY_MAX_SHORT       10  /* 短按按键最大数量 */
#define KEY_MAX_LONG        10  /* 长按按键最大数量 */



//#0 ****************************   数据类型   **************************************************************
/* 触发事件 */
typedef enum
{
    KEY_EVENT_NONE = 0,     /* 无 */
    KEY_EVENT_DOWN,         /* 按下 */
    KEY_EVENT_UP,           /* 按下抬起(不触发长按才有) */
    KEY_EVENT_LONG_START,   /* 长按开始 */
    KEY_EVENT_LONG_HOLD,    /* 长按保持 */
    KEY_EVENT_LONG_UP,      /* 长按抬起 */
} KeyEvent_E;

/* 短按按键 */
typedef struct
{
    uint8_t b1Create    : 1;        /* 创建标记 */
    uint8_t b1new_key   : 1;        /* 新的按建状态 */
    uint8_t b1old_key   : 1;        /* 旧的按键状态 */
    uint8_t             : 0;        /* 预留 */
    uint8_t u8key_value;            /* 按键键值 */

    void (*event_cb)(KeyEvent_E);   /* 按键事件处理回调函数 */
} ShortKey_T;

/* 长短按键 */
typedef struct
{
    uint8_t b1Create          : 1;  /* 创建标记 */
    uint8_t b1new_key         : 1;  /* 新的按建状态 */
    uint8_t b1old_key         : 1;  /* 旧的按键状态 */
    uint8_t b1long_start_flag : 1;  /* 长按开始标志,用于按键抬起动作 */
    uint8_t                   : 0;  /* 预留 */
    uint8_t u8key_value;            /* 按键键值 */

    uint8_t  u8long_hold_time;      /* 长按保持时间 */
    uint16_t u16long_start_time;    /* 长按开始时间 */
    uint16_t u16comparison_time;    /* 按下比较时间 */
    uint16_t u16hold_time;          /* 按下保持时间 */

    void (*event_cb)(KeyEvent_E);   /* 按键事件处理回调函数 */
} LongKey_T;



//#1 ****************************   函数声明   **************************************************************
/* 初始化 */
void KeyEvent_Init(void);

/* 按键扫描 */
void KeyEvent_Tick(uint8_t key_val);

/* 短按按键注册 */
#if KEY_MAX_SHORT
ShortKey_T *KeyEvent_CreateShort(void (*event_cb)(KeyEvent_E), uint8_t key_val);
#endif

/* 长短按键注册 */
#if KEY_MAX_LONG
LongKey_T *KeyEvent_CreateLong(void (*event_cb)(KeyEvent_E), uint8_t key_val, uint16_t long_start, uint16_t long_hold);
#endif

#endif
